package com.java.base.exercise.jvm;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author RenPu
 * @Date 2021/11/17 12:08
 * @Version 1.0
 * @Description: 模拟大对象直接进入老年代，因为大对象在Survir存放不下，生成dump文件分析dump文件
 *  -XX:NewSize=104857600          //新生代初始值100M
 *  -XX:MaxNewSize=104857600       //新生代最大值100M 设置成一样是为了防止内存扩容时，产生内存抖动
 *  -XX:InitialHeapSize=209715200  //堆初始化值 200M
 *  -XX:MaxHeapSize=209715200      //堆最大值   200M
 *  -XX:SurvivorRatio=8            //Eden:Survir1:Survir2  8:1:1
 *  -XX:MaxTenuringThreshold=15    //设置触发进入老年代的年龄阈值
 *  -XX:PretenureSizeThreshold=20971520  //设置大对象的阈值为20M
 *  -XX:+UseParNewGC                    //指定使用ParNew(并发垃圾回收器)
 *  -XX:+UseConcMarkSweepGC             //指定使用CMS(并发垃圾回收器，碎片化的整理：空间整理，压缩处理)
 *  -XX:+PrintGCDetails                 //打印GC的详细信息
 *  -XX:+PrintGCTimeStamps              //打印GC触发时间
 *  -Xloggc:gc.log                      //生成GC日志，输出到本地磁盘
 *  1:使用jps查看java进程
 *  2：使用jstat -gc 1000 100 查看GC情况，一秒打印一次，打印100次
 *  3：使用jmap 查看堆转储文件分析里面的大对象 jmap -histo PID 将对象由大到小进行排列，jmap -dump:live,format=b,file=dump.hprof PID 当前目录生成dump.hprof文件
 *  4：使用jhat dump.hprof -port 7000 通过端口进行可视化页面获取
 *  jmap -dump:live,format=b,file=dump.hprof PID
 *
 *
 *  JVM参数模板---公用版本
 *  -Xms4096M           //堆的初始值
 *  -Xmx4096M           //堆的最大值
 *  -Xmn3072M           //新生代大小
 *  -Xss1M              //虚拟机栈大小
 *  -XX:MetaspaceSize=256M  //元空间初始值
 *  -XX:MaxMetaspaceSize=256M //元空间最大值
 *  -XX:+UseParNewGC          //指定使用ParNew并发垃圾回收器（新生代，采用复制算法）
 *  -XX:+UseConcMarkSweepGC   //指定使用CMS 并发垃圾回收器（老年代，标记清除，使用空间压缩整理避免空间碎片化，会产生浮动垃圾一般不允许空间占满，需要给浮动垃圾留有空间）
 *  -XX:CMSInitiatingOccupancyFaction=92    //设置老年代自动触发FullGC的内存规则，当内存被占有百分之92，触发FullGC
 *  -XX:+UseCMSCompactAtFullCollection      //默认都是开启空间压缩整理
 *  -XX:CMSFullGCsBeforeCompaction=0        //每次GC后，都进行空间压缩整理，避免空间碎片化
 *  -XX:+CMSParallelInitialMarkEnabled     // 多线程并发执行
 *  -XX:+CMSScavengeBeforeRemark           // 参数可以做到在重新标记前先执行一次新生代GC，避免重新标记通过GCRoot链路标记损耗过大性能
 *  -XX:+DisableExplicitGC                 //禁止显示调用gc方法：例如：System.gc()
 *  -XX:+PrintGCDetails                    //打印GC详细信息
 *  -Xloggc:gc.log                         //打印GC日志
 *  -XX:+HeapDumpOnOutOfMemoryError        //当发生oom，自动触发生成堆转储快照
 *  -XX:HeapDumpPath=/usr/local/app/oom    //生成堆转储快照，指定的存储路径
 **/
public class GCDemo4 {

    public static void main(String[] args) throws Exception {

        List<Data> arry = new ArrayList<Data>();
        for (int i = 0; i <10000 ; i++) {
            arry.add(new Data());

        }
        Thread.sleep(1*60*60*1000);

    }

  static class Data{}

}
